package src.main.java.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import src.main.java.entity.Ocorrencia;
import src.main.java.entity.TipoOcorrencia;


public class OcorrenciaDAO {
	
	private DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
	
	public Ocorrencia getOcorrenciaById(Integer id){
		Ocorrencia o = null;
		try{
			
			String query = "SELECT idOcorrencia, cpf, data, descricao, removido, tipoOcorrencia, valor FROM ocorrencia WHERE removido = false and idOcorrencia = " + id;
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
			
			while(rs.next()){
				o = new Ocorrencia();
				o.setId(rs.getInt("idOcorrencia"));
				o.setCpf(rs.getLong("cpf"));
				o.setRemovido(false);
				o.setData(rs.getDate("data"));
				o.setDescricao(rs.getString("descricao"));
				o.setValor(rs.getDouble("valor"));
				TipoOcorrencia tipo = new TipoOcorrencia();
				tipo = getTipoOcorrencia(rs.getInt("tipoOcorrencia"));
				o.setTipo(tipo);
			}

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return o;
	}

	public boolean saveOcorrencia(Ocorrencia o){
		try{
			
			String query = "INSERT INTO ocorrencia VALUES("
			    + "'" + o.getCpf() + "', " 
				+ "to_date('"+df.format(o.getData())  + "', 'dd/MM/yyyy'), "
				+ o.getValor()  + ", "
				+ "'"+ o.getDescricao() + "', "
				+ o.getTipo().getId()  + ", "
				+ "false, nextval('ocorrencia_id_seq'))";
				
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Save Ocorrencia executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	public boolean editOcorrencia(Ocorrencia o){
		try{
			
			String query = "UPDATE ocorrencia set";
			if(o.getData() != null){
				query += " data = to_date('" +df.format(o.getData())  + "', 'dd/MM/yyyy') ,";
			}
			if(o.getDescricao() != null){
				query += " descricao = '" + o.getDescricao() + "' ,";
			}
			if(o.getValor() != null){
				query += " valor = " + o.getValor() + " ,";
			}
			if(o.getCpf() != null){
				query += " cpf = " + o.getCpf() + " ,";
			}
			query = query.substring(0, query.lastIndexOf(" ,"));
			query += " where idOcorrencia = " + o.getId();
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Update Ocorrencia executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	
	public boolean removeOcorrencia(Ocorrencia o){
		try{
			
			String query = "UPDATE ocorrencia set removido=true where idOcorrencia = " + o.getId();
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			stmt.executeUpdate(query);

			System.out.println("Remove Ocorrencia executado");

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
	

	public ArrayList<Ocorrencia> listOcorrencia(Ocorrencia o){
		ArrayList<Ocorrencia> listOcorrencia = new ArrayList<Ocorrencia>();
		try{
			
			String query = "SELECT idOcorrencia, cpf, data, descricao, removido, tipoOcorrencia, valor FROM ocorrencia WHERE removido = false";
			
			if(o!= null && o.getCpf() != null )
				query += " AND cpf='" + o.getCpf() +"'";
			if(o!= null && o.getData() != null)
				query += " AND data = to_date('"+df.format(o.getData()) + "', 'dd/MM/yyyy')";
			if(o!= null && o.getDescricao() != null && !o.getDescricao().isEmpty())
				query += " AND descricao = '" + o.getDescricao() +"'";
			if(o!= null && o.getTipo() != null && o.getTipo().getId() != null)
				query += " AND tipoOcorrencia = '" + o.getTipo().getId() +"'";
			if(o!= null && o.getValor() != null)
				query += " AND valor = " + o.getValor();
			if(o!=null && o.getDataInicioBusca() != null)
				query += " AND data >= to_date('"+df.format(o.getDataInicioBusca()) + "', 'dd/MM/yyyy')";
			if(o!=null && o.getDataFimBusca() != null)
				query += " AND data <= to_date('"+df.format(o.getDataFimBusca()) + "', 'dd/MM/yyyy')";
			
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
			
			while(rs.next()){
				Ocorrencia ocorrencia = new Ocorrencia();
				ocorrencia.setId(rs.getInt("idOcorrencia"));
				ocorrencia.setCpf(rs.getLong("cpf"));
				ocorrencia.setRemovido(false);
				ocorrencia.setData(rs.getDate("data"));
				ocorrencia.setDescricao(rs.getString("descricao"));
				ocorrencia.setValor(rs.getDouble("valor"));
				TipoOcorrencia tipo = new TipoOcorrencia();
				tipo = getTipoOcorrencia(rs.getInt("tipoOcorrencia"));
				ocorrencia.setTipo(tipo);
				
				listOcorrencia.add(ocorrencia);
			}

			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listOcorrencia;
	}
	
	private TipoOcorrencia getTipoOcorrencia(Integer id){
		String query = "SELECT id, tipo FROM tipoOcorrencia WHERE removido = false and id = " + id;
		
		TipoOcorrencia tipo = new TipoOcorrencia();
		try {
			Connection con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
				while(rs.next()){
					tipo.setId(rs.getInt("id"));
					tipo.setTipo(rs.getString("tipo"));
					tipo.setRemovido(false);
				}
	
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return tipo;
	}
	
	public ArrayList<TipoOcorrencia> getTiposOcorrencia(){
		
		String query = "SELECT id, tipo FROM tipoOcorrencia WHERE removido = false";
		
		Connection con;
		ArrayList<TipoOcorrencia> tiposOcorrencia = new ArrayList<TipoOcorrencia>();
		try {
			con = getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);
			
			while(rs.next()){
				TipoOcorrencia tipo = new TipoOcorrencia();
				tipo.setId(rs.getInt("id"));
				tipo.setTipo(rs.getString("tipo"));
				
				tiposOcorrencia.add(tipo);
			}
	
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return tiposOcorrencia;
	}
	
	private Connection getConnection() throws Exception {
		Class.forName("org.postgresql.Driver");
		Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mc437","postgres","postgres");
//		Connection con = DriverManager.getConnection("jdbc:postgresql://staff01.lab.ic.unicamp.br:5432/grupo4","grupo4","ep:eik4Xu5");
		return con;
	}

}